package config

import (
	"os"

	"gopkg.in/yaml.v3"
)

// ConcurrencyMode 并发模式
type ConcurrencyMode string

const (
	// ModeDynamic 动态调整并发数
	ModeDynamic ConcurrencyMode = "dynamic"
	// ModeStatic 静态固定并发数
	ModeStatic ConcurrencyMode = "static"
	// ModeAuto 自动检测系统资源
	ModeAuto ConcurrencyMode = "auto"
)

type VideoConfig struct {
	InputDir   string `yaml:"input_dir"`
	OutputDirs struct {
		Low     string `yaml:"low"`
		WebM    string `yaml:"webm"`
		Posters string `yaml:"posters"`
	} `yaml:"output_dirs"`
	VideoSettings struct {
		Low struct {
			Resolution string `yaml:"resolution"`
			Bitrate    string `yaml:"bitrate"`
			FPS        int    `yaml:"fps"`
			Codec      string `yaml:"codec"`
			Preset     string `yaml:"preset"`
			CRF        int    `yaml:"crf"`
		} `yaml:"low"`
		WebM struct {
			Resolution string `yaml:"resolution"`
			Bitrate    string `yaml:"bitrate"`
			FPS        int    `yaml:"fps"`
			Codec      string `yaml:"codec"`
			Quality    string `yaml:"quality"`
			CPUUsed    int    `yaml:"cpu_used"`
		} `yaml:"webm"`
	} `yaml:"video_settings"`
	PosterSettings struct {
		Format  string `yaml:"format"`
		Quality int    `yaml:"quality"`
		Size    string `yaml:"size"`
		Time    string `yaml:"time"`
	} `yaml:"poster_settings"`
	ConcurrencySettings struct {
		Mode       ConcurrencyMode `yaml:"mode"`        // 并发模式：dynamic/static/auto
		MaxWorkers int             `yaml:"max_workers"` // 最大工作协程数
		QueueSize  int             `yaml:"queue_size"`  // 任务队列大小
		// 动态模式的配置
		Dynamic struct {
			CPUThreshold    float64 `yaml:"cpu_threshold"`    // CPU 使用率阈值
			MemoryThreshold float64 `yaml:"memory_threshold"` // 内存使用率阈值
			IOThreshold     float64 `yaml:"io_threshold"`     // IO 使用率阈值
			CheckInterval   int     `yaml:"check_interval"`   // 检查间隔（秒）
			MinWorkers      int     `yaml:"min_workers"`      // 最小工作协程数
		} `yaml:"dynamic"`
		// 自动模式的配置
		Auto struct {
			MemoryPerWorker int `yaml:"memory_per_worker"` // 每个工作协程预估内存使用量（MB）
			MaxCPUPercent   int `yaml:"max_cpu_percent"`   // 最大 CPU 使用率百分比
		} `yaml:"auto"`
	} `yaml:"concurrency_settings"`
}

func LoadConfig(configPath string) (*VideoConfig, error) {
	data, err := os.ReadFile(configPath)
	if err != nil {
		return nil, err
	}

	var config VideoConfig
	if err := yaml.Unmarshal(data, &config); err != nil {
		return nil, err
	}

	// 确保输出目录存在
	dirs := []string{
		config.OutputDirs.Low,
		config.OutputDirs.WebM,
		config.OutputDirs.Posters,
	}

	for _, dir := range dirs {
		if err := os.MkdirAll(dir, 0755); err != nil {
			return nil, err
		}
	}

	return &config, nil
}
